今天來介紹 Underscore 其中一個功能 , shuffle ,
它能夠返回一個隨機排序的陣列副本 , 簡單的範例如下 :
_.shuffle([1, 2, 3, 4, 5, 6]);
=> [4, 1, 6, 3, 5, 2]
其內部實做使用 Fisher-Yates shuffle 演算法 ,
其原始碼如下 :
它會先取出第一個元素 , 並與 n 個元素做交換的動作 ,
接下來選第二個元素 , 並與 n - 1 個元素再做交換 , 以此類推
_.shuffle = function(obj) {
var set = obj && obj.length === +obj.length ? obj : _.values(obj);
var length = set.length;
var shuffled = Array(length);
for (var index = 0, rand; index < length; index++) {
rand = _.random(0, index);
if (rand !== index) shuffled[index] = shuffled[rand];
shuffled[rand] = set[index];
}
return shuffled;
};
本文同步發布於 保政島 Underscore 使用 shuffle